#ifndef H_SOLVER
#define H_SOLVER


#include "function.h"
#include "plus.h"
#include "minus.h"
#include "multiply.h"
#include "divide.h"
#include "var.h"
#include "const.h"

#include <string>

//класс конвертирует строку в дерево обхектов функции, находит корни и интегрирует.
struct Solver
{
public:
	Solver(std::string& str);
	~Solver();
	double integrate(double a, double b, double eps);
	bool solve(double a, double b, double eps, double& answer);	
	double f(double x);

private:
	Function* function;

	Function* subFunctions[100];
	int funcStackLength;
	void pushFunc(Function* func);
	Function* popFunc();		
		
	char operations[100];
	int opStackLength;
	void pushOp(char operation);
	char popOp();


	int currTokPos;
	std::string currToken;
	enum { NONE, CONST, VAR, LOW_OPERATION, HIGHT_OPERATION };

	void parseFunction(std::string& str);		
	int getTokenType(std::string str);
	void getToken(std::string str);

	double stringToDouble(std::string& str);
};

#endif
